﻿using System;
using JTLeigh.Commerce.Spencer.Features.ProductFeedback.Common.Entities;

namespace JTLeigh.Commerce.Spencer.Features.ProductFeedback.Business.Caches
{

	/// <summary>
	/// Cache used to store product feedback metadata.
	/// </summary>
	public interface IProductFeedbackMetadataCache
	{

		#region Methods

		/// <summary>
		/// Gets the product feedback metadata from the cache.
		/// </summary>
		/// <param name="tenantId">The tenant identifier <see cref="Guid"/> of the tenant whose
		/// product feedback metadata is to be retrieved.</param>
		/// <returns>The <see cref="ProductFeedbackMetadata"/> object from the cache, or <see langword="null" /> 
		/// if the product feedback metadata has not been cached.</returns>
		ProductFeedbackMetadata GetProductFeedbackMetadata(Guid tenantId);

		/// <summary>
		/// Sets the product feedback metadata in the cache.
		/// </summary>
		/// <param name="tenantId">The tenant identifier <see cref="Guid"/> of the tenant whose
		/// product feedback metadata is to be stored.</param>
		/// <param name="metadata">The <see cref="ProductFeedbackMetadata"/> object to store.</param>
		void SetProductFeedbackMetadata(Guid tenantId, ProductFeedbackMetadata metadata);

        /// <summary>
        /// Gets the product feedback badge - category relations for the specified category from 
        /// the cache.
        /// </summary>
        /// <param name="tenantId">The tenant identifier <see cref="Guid"/> of the tenant whose
        /// product feedback badge - category relations are to be retrieved.</param>
        /// <param name="catalogId">The catalog identifier <see cref="String"/> of the catalog
        /// that the category whose product feedback badge - category relations are to be retrieved
        /// is in.</param>
        /// <param name="categoryId">The category identifier <see cref="String"/> of the category
        /// whose product feedback badge - category relations are to be retrieved.</param>
        /// <returns>The <see cref="ProductFeedbackBadgeCategoryRelations"/> object for the 
        /// category from the cache, or <see langword="null" /> if product feedback badge - 
        /// category relations for the category have not been cached.</returns>
        ProductFeedbackBadgeCategoryRelations GetProductFeedbackBadgeCategoryRelations(Guid tenantId, string catalogId, string categoryId);

        /// <summary>
        /// Sets the product feedback badge - category relations for the specified category in 
        /// the cache.
        /// </summary>
        /// <param name="tenantId">The tenant identifier <see cref="Guid"/> of the tenant whose
        /// product feedback badge - category relations are to be stored.</param>
        /// <param name="catalogId">The catalog identifier <see cref="String"/> of the catalog
        /// whose product feedback badge - category relations are to be stored.</param>
        /// <param name="categoryId">The category identifier <see cref="String"/> of the category
        /// whose product feedback badge - category relations are to be stored.</param>
        /// <param name="relations">The <see cref="SetProductFeedbackBadgeCategoryRelations"/> 
        /// object to store.</param>
        void SetProductFeedbackBadgeCategoryRelations(Guid tenantId, string catalogId, string categoryId, ProductFeedbackBadgeCategoryRelations relations);

        /// <summary>
        /// Gets the product feedback badge - product relations for the specified product from 
        /// the cache.
        /// </summary>
        /// <param name="tenantId">The tenant identifier <see cref="Guid"/> of the tenant whose
        /// product feedback badge - product relations are to be retrieved.</param>
        /// <param name="catalogId">The catalog identifier <see cref="String"/> of the catalog
        /// that the product whose product feedback badge - product relations are to be retrieved
        /// is in.</param>
        /// <param name="productId">The product identifier <see cref="String"/> of the product
        /// whose product feedback badge - product relations are to be retrieved.</param>
        /// <returns>The <see cref="ProductFeedbackBadgeProductRelations"/> object for the 
        /// product from the cache, or <see langword="null" /> if product feedback badge - 
        /// product relations for the product have not been cached.</returns>
        ProductFeedbackBadgeProductRelations GetProductFeedbackBadgeProductRelations(Guid tenantId, string catalogId, string productId);

        /// <summary>
        /// Sets the product feedback badge - product relations for the specified product in the
        /// cache.
        /// </summary>
        /// <param name="tenantId">The tenant identifier <see cref="Guid"/> of the tenant whose
        /// product feedback badge - product relations are to be stored.</param>
        /// <param name="catalogId">The catalog identifier <see cref="String"/> of the catalog
        /// whose product feedback badge - product relations are to be stored.</param>
        /// <param name="productId">The product identifier <see cref="String"/> of the product
        /// whose product feedback badge - product relations are to be stored.</param>
        /// <param name="relations">The <see cref="SetProductFeedbackBadgeProductRelations"/> 
        /// object to store.</param>
        void SetProductFeedbackBadgeProductRelations(Guid tenantId, string catalogId, string productId, ProductFeedbackBadgeProductRelations relations);

        /// <summary>
		/// Gets the product rating attribute - category relations for the specified category from 
		/// the cache.
		/// </summary>
		/// <param name="tenantId">The tenant identifier <see cref="Guid"/> of the tenant whose
		/// product rating attribute - category relations are to be retrieved.</param>
        /// <param name="catalogId">The catalog identifier <see cref="String"/> of the catalog
        /// that the category whose product rating attribute - category relations are to be 
        /// retrieved are in.</param>
        /// <param name="categoryId">The category identifier <see cref="String"/> of the category
		/// whose product rating attribute - category relations are to be retrieved.</param>
		/// <returns>The <see cref="ProductRatingAttributeCategoryRelations"/> object for the 
		/// category from the cache, or <see langword="null" /> if product rating attribute - 
		/// category relations for the category have not been cached.</returns>
		ProductRatingAttributeCategoryRelations GetProductRatingAttributeCategoryRelations(Guid tenantId, string catalogId, string categoryId);

		/// <summary>
		/// Sets the product rating attribute - category relations for the specified category in 
		/// the cache.
		/// </summary>
		/// <param name="tenantId">The tenant identifier <see cref="Guid"/> of the tenant whose
		/// product rating attribute - category relations are to be stored.</param>
        /// <param name="catalogId">The catalog identifier <see cref="String"/> of the catalog
        /// whose product rating attribute - category relations are to be stored.</param>
        /// <param name="categoryId">The category identifier <see cref="String"/> of the category
		/// whose product rating attribute - category relations are to be stored.</param>
		/// <param name="relations">The <see cref="SetProductRatingAttributeCategoryRelations"/> 
		/// object to store.</param>
		void SetProductRatingAttributeCategoryRelations(Guid tenantId, string catalogId, string categoryId, ProductRatingAttributeCategoryRelations relations);

		/// <summary>
		/// Gets the product rating attribute - product relations for the specified product from 
		/// the cache.
		/// </summary>
		/// <param name="tenantId">The tenant identifier <see cref="Guid"/> of the tenant whose
		/// product rating attribute - product relations are to be retrieved.</param>
        /// <param name="catalogId">The catalog identifier <see cref="String"/> of the catalog
        /// that the product whose product rating attribute - product relations are to be retrieved
        /// is in.</param>
        /// <param name="productId">The product identifier <see cref="String"/> of the product
		/// whose product rating attribute - product relations are to be retrieved.</param>
		/// <returns>The <see cref="ProductRatingAttributeProductRelations"/> object for the 
		/// product from the cache, or <see langword="null" /> if product rating attribute - 
		/// product relations for the product have not been cached.</returns>
		ProductRatingAttributeProductRelations GetProductRatingAttributeProductRelations(Guid tenantId, string catalogId, string productId);

		/// <summary>
		/// Sets the product rating attribute - product relations for the specified product in the
		/// cache.
		/// </summary>
		/// <param name="tenantId">The tenant identifier <see cref="Guid"/> of the tenant whose
		/// product rating attribute - product relations are to be stored.</param>
        /// <param name="catalogId">The catalog identifier <see cref="String"/> of the catalog
        /// whose product rating attribute - product relations are to be stored.</param>
        /// <param name="productId">The product identifier <see cref="String"/> of the product
		/// whose product rating attribute - product relations are to be stored.</param>
		/// <param name="relations">The <see cref="SetProductRatingAttributeProductRelations"/> 
		/// object to store.</param>
		void SetProductRatingAttributeProductRelations(Guid tenantId, string catalogId, string productId, ProductRatingAttributeProductRelations relations);

		/// <summary>
		/// Gets the product recommendation attribute - category relations for the specified 
		/// category from the cache.
		/// </summary>
		/// <param name="tenantId">The tenant identifier <see cref="Guid"/> of the tenant whose
		/// product recommendation attribute - category relations are to be retrieved.</param>
        /// <param name="catalogId">The catalog identifier <see cref="String"/> of the catalog
        /// that the category whose product recommendation attribute - category relations are to be 
        /// retrieved is in.</param>
        /// <param name="categoryId">The category identifier <see cref="String"/> of the category
		/// whose product recommendation attribute - category relations are to be retrieved.</param>
		/// <returns>The <see cref="ProductRecommendationAttributeCategoryRelations"/> object for 
		/// the category from the cache, or <see langword="null" /> if product recommendation 
		/// attribute - category relations for the category have not been cached.</returns>
		ProductRecommendationAttributeCategoryRelations GetProductRecommendationAttributeCategoryRelations(Guid tenantId, string catalogId, string categoryId);

		/// <summary>
		/// Sets the product recommendation attribute - category relations for the specified 
		/// category in the cache.
		/// </summary>
		/// <param name="tenantId">The tenant identifier <see cref="Guid"/> of the tenant whose
		/// product recommendation attribute - category relations are to be stored.</param>
        /// <param name="catalogId">The catalog identifier <see cref="String"/> of the catalog
        /// whose product recommendation attribute - category relations are to be stored.</param>
        /// <param name="categoryId">The category identifier <see cref="String"/> of the category
		/// whose product recommendation attribute - category relations are to be stored.</param>
		/// <param name="relations">The <see cref="SetProductRecommendationAttributeCategoryRelations"/> 
		/// object to store.</param>
		void SetProductRecommendationAttributeCategoryRelations(Guid tenantId, string catalogId, string categoryId, ProductRecommendationAttributeCategoryRelations relations);

		/// <summary>
		/// Gets the product recommendation attribute - product relations for the specified product 
		/// from the cache.
		/// </summary>
		/// <param name="tenantId">The tenant identifier <see cref="Guid"/> of the tenant whose
		/// product recommendation attribute - product relations are to be retrieved.</param>
        /// <param name="catalogId">The catalog identifier <see cref="String"/> of the catalog
        /// that the product whose product recommendation attribute - product relations are to be 
        /// retrieved is in.</param>
        /// <param name="productId">The product identifier <see cref="String"/> of the product
		/// whose product recommendation attribute - product relations are to be retrieved.</param>
		/// <returns>The <see cref="ProductRecommendationAttributeProductRelations"/> object for 
		/// the product from the cache, or <see langword="null" /> if product recommendation 
		/// attribute - product relations for the product have not been cached.</returns>
		ProductRecommendationAttributeProductRelations GetProductRecommendationAttributeProductRelations(Guid tenantId, string catalogId, string productId);

		/// <summary>
		/// Sets the product recommendation attribute - product relations for the specified product 
		/// in the cache.
		/// </summary>
		/// <param name="tenantId">The tenant identifier <see cref="Guid"/> of the tenant whose
		/// product recommendation attribute - product relations are to be stored.</param>
        /// <param name="catalogId">The catalog identifier <see cref="String"/> of the catalog
        /// whose product recommendation attribute - product relations are to be stored.</param>
        /// <param name="productId">The product identifier <see cref="String"/> of the product 
		/// whose product recommendation attribute - product relations are to be stored.</param>
		/// <param name="relations">The <see cref="SetProductRecommendationAttributeProductRelations"/> 
		/// object to store.</param>
		void SetProductRecommendationAttributeProductRelations(Guid tenantId, string catalogId, string productId, ProductRecommendationAttributeProductRelations relations);

		/// <summary>
		/// Gets the product review attribute - category relations for the specified category from 
		/// the cache.
		/// </summary>
		/// <param name="tenantId">The tenant identifier <see cref="Guid"/> of the tenant whose
		/// product review attribute - category relations are to be retrieved.</param>
        /// <param name="catalogId">The catalog identifier <see cref="String"/> of the catalog
        /// that the category whose product review attribute - category relations are to be 
        /// retrieved is in.</param>
        /// <param name="categoryId">The category identifier <see cref="String"/> of the category
		/// whose product review attribute - category relations are to be retrieved.</param>
		/// <returns>The <see cref="ProductReviewAttributeCategoryRelations"/> object for the
		/// category from the cache, or <see langword="null" /> if product review attribute - 
		/// category relations for the category have not been cached.</returns>
		ProductReviewAttributeCategoryRelations GetProductReviewAttributeCategoryRelations(Guid tenantId, string catalogId, string categoryId);

		/// <summary>
		/// Sets the product review attribute - category relations for the specified category in 
		/// the cache.
		/// </summary>
		/// <param name="tenantId">The tenant identifier <see cref="Guid"/> of the tenant whose
		/// product review attribute - category relations are to be stored.</param>
        /// <param name="catalogId">The catalog identifier <see cref="String"/> of the catalog
        /// whose product review attribute - category relations are to be stored.</param>
        /// <param name="categoryId">The category identifier <see cref="String"/> of the category
		/// whose product review attribute - category relations are to be stored.</param>
		/// <param name="relations">The <see cref="SetProductReviewAttributeCategoryRelations"/> 
		/// object to store.</param>
		void SetProductReviewAttributeCategoryRelations(Guid tenantId, string catalogId, string categoryId, ProductReviewAttributeCategoryRelations relations);

		/// <summary>
		/// Gets the product review attribute - product relations for the specified product from 
		/// the cache.
		/// </summary>
		/// <param name="tenantId">The tenant identifier <see cref="Guid"/> of the tenant whose
		/// product review attribute - product relations are to be retrieved.</param>
        /// <param name="catalogId">The catalog identifier <see cref="String"/> of the catalog
        /// that the product whose product review attribute - product relations are to be retrieved
        /// is in.</param>
        /// <param name="productId">The product identifier <see cref="String"/> of the product 
		/// whose product review attribute - product relations are to be retrieved.</param>
		/// <returns>The <see cref="ProductReviewAttributeProductRelations"/> object for the 
		/// product from the cache, or <see langword="null" /> if product review attribute - 
		/// product relations for the product have not been cached.</returns>
		ProductReviewAttributeProductRelations GetProductReviewAttributeProductRelations(Guid tenantId, string catalogId, string productId);

		/// <summary>
		/// Sets the product review attribute - product relations for the specified product in the
		/// cache.
		/// </summary>
		/// <param name="tenantId">The tenant identifier <see cref="Guid"/> of the tenant whose
		/// product review attribute - product relations are to be stored.</param>
        /// <param name="catalogId">The catalog identifier <see cref="String"/> of the catalog
        /// whose product review attribute - product relations are to be stored.</param>
        /// <param name="productId">The product identifier <see cref="String"/> of the product
		/// whose product review attribute - product relations are to be stored.</param>
		/// <param name="relations">The <see cref="SetProductReviewAttributeProductRelations"/> 
		/// object to store.</param>
		void SetProductReviewAttributeProductRelations(Guid tenantId, string catalogId, string productId, ProductReviewAttributeProductRelations relations);

		#endregion // Methods

	}

}
